package com.hello915.googledirectionapi.route.result;

import java.util.LinkedList;
import java.util.List;

import com.google.android.gms.maps.model.LatLng;

/**
 * 任何一个Route、Leg、Step对象都有一个PolyLine，由一组有序的坐标点组成的线
 * @author Dorian
 *
 */
public class PolyLine{

	/**
	 * 编码过的字符串，需要解码成List<LatLng>
	 */
	public String points;
	
	/**
	 * 添加的字段，方便直接取坐标点
	 */
	private List<LatLng> wayPoint;
	
	public List<LatLng> getWayPoint(){
		if(wayPoint == null){
			wayPoint = decodePolyLine(points);
		}
		return wayPoint;
	}
	
	/**
	 * 这是一个解码算法，因为google direction api 返回的线是一个加密后的字符串
	 * @param poly
	 * @return
	 */
	private List<LatLng> decodePolyLine(final String poly) {
		int len = poly.length();
		int index = 0;
		List<LatLng> decoded = new LinkedList<LatLng>();
		int lat = 0;
		int lng = 0;

		while (index < len) {
			int b;
			int shift = 0;
			int result = 0;
			do {
				b = poly.charAt(index++) - 63;
				result |= (b & 0x1f) << shift;
				shift += 5;
			} while (b >= 0x20);
			int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
			lat += dlat;

			shift = 0;
			result = 0;
			do {
				b = poly.charAt(index++) - 63;
				result |= (b & 0x1f) << shift;
				shift += 5;
			} while (b >= 0x20);
			int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
			lng += dlng;

			decoded.add(new LatLng((lat / 1E5),(lng / 1E5)));
		}

		return decoded;
	}

}

